//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Coche.h"
//---------------------------------------------------------------------------
Coche::Coche(){
        _puntos=NULL;
        _rotacion_ruedas=0;

        _ruedaA=gluNewQuadric();
        _ruedaB=gluNewQuadric();
        _ruedaC=gluNewQuadric();
        _ruedaD=gluNewQuadric();
        _tapacubosA=gluNewQuadric();
        _tapacubosB=gluNewQuadric();
        _tapacubosC=gluNewQuadric();
        _tapacubosD=gluNewQuadric();
}

Coche::Coche(PV3D** lesPuntos){
        _puntos=lesPuntos;
        _rotacion_ruedas=0;

        _ruedaA=gluNewQuadric();
        _ruedaB=gluNewQuadric();
        _ruedaC=gluNewQuadric();
        _ruedaD=gluNewQuadric();
        _tapacubosA=gluNewQuadric();
        _tapacubosB=gluNewQuadric();
        _tapacubosC=gluNewQuadric();
        _tapacubosD=gluNewQuadric();
}

Coche::~Coche(){
        for(int i=0; i<2; i++){
                delete _puntos[i];
        }
        delete[] _puntos;

        gluDeleteQuadric(_ruedaA);
        gluDeleteQuadric(_ruedaB);
        gluDeleteQuadric(_ruedaC);
        gluDeleteQuadric(_ruedaD);
        gluDeleteQuadric(_tapacubosA);
        gluDeleteQuadric(_tapacubosB);
        gluDeleteQuadric(_tapacubosC);
        gluDeleteQuadric(_tapacubosD);
}

void Coche::mueve(PV3D** lesPuntos){
        _puntos[0]->mueve(lesPuntos[0]);
        _puntos[1]->mueve(lesPuntos[1]);
        if(_rotacion_ruedas>=360.0){
                _rotacion_ruedas=45.0;
        }else{
                _rotacion_ruedas+=45.0;
        }
}

void Coche::dibuja(bool modo){

        PV3D* plano=new PV3D(_puntos[0]->getX()-_puntos[1]->getX(),0.0,
                _puntos[0]->getZ()-_puntos[1]->getZ(),0);
        plano->normaliza();

        PV3D* normal_al_plano = new PV3D(-(plano->getZ()),0.0,plano->getX(),0);
        double x,y,z;
        glColor4f(1.0,1.0,1.0,1.0);
        glBegin(GL_POLYGON);
                //arriba
                glNormal3d(0,1,0);
                x=_puntos[1]->getX()+(-normal_al_plano->getX()*ml_coche);
                y=ml_coche;
                z=_puntos[1]->getZ()+(-normal_al_plano->getZ()*ml_coche);
                glVertex3d(x,y,z);//A
                glNormal3d(0,1,0);
                x=_puntos[1]->getX()+(normal_al_plano->getX()*ml_coche);
                z=_puntos[1]->getZ()+(normal_al_plano->getZ()*ml_coche);
                glVertex3d(x,y,z);//B
                glNormal3d(0,1,0);
                x=_puntos[0]->getX()+(normal_al_plano->getX()*ml_coche);
                z=_puntos[0]->getZ()+(normal_al_plano->getZ()*ml_coche);
                glVertex3d(x,y,z);//C
                glNormal3d(0,1,0);
                x=_puntos[0]->getX()+(-normal_al_plano->getX()*ml_coche);
                z=_puntos[0]->getZ()+(-normal_al_plano->getZ()*ml_coche);
                glVertex3d(x,y,z);//D
        glEnd();
        glBegin(GL_POLYGON);
                //izquierda
                glNormal3d(plano->getX(),0,plano->getZ());
                glVertex3d(x,y,z);//D:es el ultimo de la etapa anterior
                glNormal3d(plano->getX(),0,plano->getZ());
                x=_puntos[0]->getX()+(normal_al_plano->getX()*ml_coche);
                z=_puntos[0]->getZ()+(normal_al_plano->getZ()*ml_coche);
                glVertex3d(x,y,z);//C
                glNormal3d(plano->getX(),0,plano->getZ());
                y=-ml_coche;
                glVertex3d(x,y,z);//E
                glNormal3d(plano->getX(),0,plano->getZ());
                x=_puntos[0]->getX()+(-normal_al_plano->getX()*ml_coche);
                z=_puntos[0]->getZ()+(-normal_al_plano->getZ()*ml_coche);
                glVertex3d(x,y,z);//F
        glEnd();
        glBegin(GL_POLYGON);
                //delante
                glNormal3d(-normal_al_plano->getX(),0,-normal_al_plano->getZ());
                glVertex3d(x,y,z);//F otra vez
                glNormal3d(-normal_al_plano->getX(),0,-normal_al_plano->getZ());
                x=_puntos[1]->getX()+(-normal_al_plano->getX()*ml_coche);
                z=_puntos[1]->getZ()+(-normal_al_plano->getZ()*ml_coche);
                glVertex3d(x,y,z);//G
                glNormal3d(-normal_al_plano->getX(),0,-normal_al_plano->getZ());
                y=ml_coche;
                glVertex3d(x,y,z);//A otra vez
                glNormal3d(-normal_al_plano->getX(),0,-normal_al_plano->getZ());
                x=_puntos[0]->getX()+(-normal_al_plano->getX()*ml_coche);
                z=_puntos[0]->getZ()+(-normal_al_plano->getZ()*ml_coche);
                glVertex3d(x,y,z);//D otra vez
        glEnd();

        glBegin(GL_POLYGON);
                //debajo
                glNormal3d(0,-1,0);
                x=_puntos[0]->getX()+(normal_al_plano->getX()*ml_coche);
                y=-ml_coche;
                z=_puntos[0]->getZ()+(normal_al_plano->getZ()*ml_coche);
                glVertex3d(x,y,z);//E otra vez
                glNormal3d(0,-1,0);
                x=_puntos[0]->getX()+(-normal_al_plano->getX()*ml_coche);
                z=_puntos[0]->getZ()+(-normal_al_plano->getZ()*ml_coche);
                glVertex3d(x,y,z);//F
                glNormal3d(0,-1,0);
                x=_puntos[1]->getX()+(-normal_al_plano->getX()*ml_coche);
                z=_puntos[1]->getZ()+(-normal_al_plano->getZ()*ml_coche);
                glVertex3d(x,y,z);//G
                glNormal3d(0,-1,0);
                x=_puntos[1]->getX()+(normal_al_plano->getX()*ml_coche);
                z=_puntos[1]->getZ()+(normal_al_plano->getZ()*ml_coche);
                glVertex3d(x,y,z);//H  ->esta debajo de b
        glEnd();

        glBegin(GL_POLYGON);
                //derecha
                glNormal3d(-plano->getX(),0,-plano->getZ());
                x=_puntos[1]->getX()+(normal_al_plano->getX()*ml_coche);
                y=ml_coche;
                z=_puntos[1]->getZ()+(normal_al_plano->getZ()*ml_coche);
                glVertex3d(x,y,z);//B otra vez
                glNormal3d(-plano->getX(),0,-plano->getZ());
                x=_puntos[1]->getX()+(-normal_al_plano->getX()*ml_coche);
                z=_puntos[1]->getZ()+(-normal_al_plano->getZ()*ml_coche);
                glVertex3d(x,y,z);//A otra vez
                glNormal3d(-plano->getX(),0,-plano->getZ());
                x=_puntos[1]->getX()+(-normal_al_plano->getX()*ml_coche);
                y=-ml_coche;
                z=_puntos[1]->getZ()+(-normal_al_plano->getZ()*ml_coche);
                glVertex3d(x,y,z);//G otra vez
                glNormal3d(-plano->getX(),0,-plano->getZ());
                x=_puntos[1]->getX()+(normal_al_plano->getX()*ml_coche);
                z=_puntos[1]->getZ()+(normal_al_plano->getZ()*ml_coche);
                glVertex3d(x,y,z);//H
        glEnd();

        glBegin(GL_POLYGON);
                //detras
                glNormal3d(normal_al_plano->getX(),0,normal_al_plano->getZ());
                glVertex3d(x,y,z);//H otra vez
                glNormal3d(normal_al_plano->getX(),0,normal_al_plano->getZ());
                x=_puntos[0]->getX()+(normal_al_plano->getX()*ml_coche);
                z=_puntos[0]->getZ()+(normal_al_plano->getZ()*ml_coche);
                glVertex3d(x,y,z);//E otra vez
                glNormal3d(normal_al_plano->getX(),0,normal_al_plano->getZ());
                x=_puntos[0]->getX()+(normal_al_plano->getX()*ml_coche);
                y=ml_coche;
                z=_puntos[0]->getZ()+(normal_al_plano->getZ()*ml_coche);
                glVertex3d(x,y,z);//C otra vez
                glNormal3d(normal_al_plano->getX(),0,normal_al_plano->getZ());
                x=_puntos[1]->getX()+(normal_al_plano->getX()*ml_coche);
                z=_puntos[1]->getZ()+(normal_al_plano->getZ()*ml_coche);
                glVertex3d(x,y,z);//B otra vez
        glEnd();

        pinta_ruedas(plano,normal_al_plano,modo);

        delete plano;
        delete normal_al_plano;
}

void Coche::setPuntos(PV3D** lesPuntos){
        _puntos=lesPuntos;
}

void Coche::pinta_ruedas(PV3D* plano, PV3D* normal_al_plano, bool modo){

        double x,y,z,cos_ang,ang_rad,angulo;
        PV3D* eje_z=new PV3D(0,0,1,0);
        y=-ml_coche;

        glColor4f(0.0,0.0,0.0,0.0);
        gluQuadricDrawStyle(_ruedaA,GLU_FILL);
        //gluQuadricDrawStyle(_ruedaA,GLU_LINE);
        gluQuadricDrawStyle(_ruedaB,GLU_FILL);
        gluQuadricDrawStyle(_ruedaC,GLU_FILL);
        gluQuadricDrawStyle(_ruedaD,GLU_FILL);

        gluQuadricDrawStyle(_tapacubosA,GLU_FILL);
        gluQuadricDrawStyle(_tapacubosB,GLU_FILL);
        gluQuadricDrawStyle(_tapacubosC,GLU_FILL);
        gluQuadricDrawStyle(_tapacubosD,GLU_FILL);

        glPushMatrix();//1

        x=_puntos[0]->getX()+(normal_al_plano->getX()*ml_coche);
        z=_puntos[0]->getZ()+(normal_al_plano->getZ()*ml_coche);

        double ang_tan=atan2(plano->getZ(), plano->getX());
        double senaco=sin(ang_tan);
        double cosaco=cos(ang_tan);
        ang_tan=ang_tan* 180 / PI;

        cos_ang=(plano->productoEscalar(eje_z))/plano->modulo(); //el vector del eje z tiene modulo 1
        ang_rad=acos(cos_ang);

        if(cosaco<0){//angulo es obtuso
                ang_rad=2*PI-ang_rad;
        }//si angulo es agudo no hago nada


        angulo=(ang_rad)*180.0/PI;

        glTranslated(x,y,z);

        glColor4f(0.0,0.0,0.0,0.0);
        
        glRotated(angulo,0.0,1.0,0.0);

        glRotated(_rotacion_ruedas,0,0,1);
        gluCylinder(_ruedaA,ml_coche/2,ml_coche/2,ml_coche/2,6,3);

        glTranslated(0,0,ml_coche/2);
        gluDisk(_tapacubosA,0,ml_coche/2,6,3);
        glPopMatrix();

        glPushMatrix();//2

        x=_puntos[1]->getX()+(normal_al_plano->getX()*ml_coche);
        z=_puntos[1]->getZ()+(normal_al_plano->getZ()*ml_coche);
        glTranslated(x,y,z);
        glRotated(angulo-180,0.0,1.0,0.0);
        glRotated(_rotacion_ruedas,0,0,1);
        gluCylinder(_ruedaB,ml_coche/2,ml_coche/2,ml_coche/2,6,3);
        glTranslated(0,0,ml_coche/2);
        gluDisk(_tapacubosB,0,ml_coche/2,6,3);

        glPopMatrix();

        x=_puntos[1]->getX()+(-normal_al_plano->getX()*ml_coche);
        z=_puntos[1]->getZ()+(-normal_al_plano->getZ()*ml_coche);

        glPushMatrix();//3

        glTranslated(x,y,z);
        glRotated(angulo-180,0.0,1.0,0.0);
        glRotated(_rotacion_ruedas,0,0,1);
        gluCylinder(_ruedaC,ml_coche/2,ml_coche/2,ml_coche/2,6,3);
        glTranslated(0,0,ml_coche/2);
        gluDisk(_tapacubosC,0,ml_coche/2,6,3);

        glPopMatrix();

        x=_puntos[0]->getX()+(-normal_al_plano->getX()*ml_coche);
        z=_puntos[0]->getZ()+(-normal_al_plano->getZ()*ml_coche);

        glPushMatrix();//4

        glTranslated(x,y,z);
        glRotated(angulo,0.0,1.0,0.0);
        glRotated(_rotacion_ruedas,0,0,1);
        gluCylinder(_ruedaD,ml_coche/2,ml_coche/2,ml_coche/2,6,3);
        glTranslated(0,0,ml_coche/2);
        gluDisk(_tapacubosD,0,ml_coche/2,6,3);

        glPopMatrix();
        delete eje_z;
}
//---------------------------------------------------------------------------
#pragma package(smart_init)
